/**
 * 创建store对象
 * @param {*} reducer reducer函数
 * @returns store对象
 */
export function createStore(reducer) {
  // redux管理状态数据
  let currentState;
  // 存储listener的容器
  const listeners = [];

  /**
   * 获取redux管理的数据
   */
  function getState() {
    return currentState;
  }

  /**
   * 触发更新 - 触发reducer
   * @param {*} action action对象
   */
  function dispatch(action) {
    // 触发reducer：调用reducer函数得到newState
    // const newState = reducer(currentState, action);
    // 更新数据
    // currentState = newState;
    currentState = reducer(currentState, action); // 更新数据

    // 调用listener函数，listener函数封装更新用户界面的方法，所以更新用户界面
    listeners.forEach((listener) => listener());
  }

  /**
   * 当redux数据发送变化时，触发listener
   * @param {*} listener
   */
  function subscribe(listener) {
    listeners.push(listener);

    // 返回值是解绑listener
    return () => {
      // 将listener从listeners中删除
      const index = listeners.indexOf(listener);
      listeners.splice(index, 1);
    };
  }

  // 一上来需要给redux初始化值
  // 需要走reducer函数的default，需要action.type必须指定一个不会命中的type
  dispatch({ type: "@@redux/INIT-abcdefg" });

  // 返回值store对象
  return {
    getState,
    dispatch,
    subscribe,
  };
}
